<?php

/**
 * @copyright (c) 2013-03, 崔俊涛
 * @version V1.0
 */
class BaseYsp {

    /**
     * 获取远程网址返回的状态码
     * @param string $url 网址
     */
    static function getHttpCode($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200
        curl_close($ch);
        return $http_code;
    }

    /**
      +--------------------------------------------------------------------------
     * 返回由JSON编码后的字符串，中文进行过转换处理
     * @param array $array 要用JSON编码的数组，必须是一个二维数组
     * 先对中文进行编码，JSON之后再解码。使用的时候直接输出即可
      +--------------------------------------------------------------------------
     */
    static function jsonEnCode($array) {
        if (empty($array)) {
            return '';
        }
        foreach ($array as $key => $arr) {
            foreach ($arr as $k2 => $val) {
                $array[$key][$k2] = urlencode($val);
            }
        }
        $json_encode = addslashes(json_encode($array));
        return urldecode($json_encode);
    }

    /**
      +--------------------------------------------------------------------------
     * 返回由JSON解码后的数组
     * @param string $string 要用JSON解码的字符串
     * 先对字符串进行反转义
     * 如果传入的是一个字数组，就直接返回空
      +--------------------------------------------------------------------------
     */
    static function jsonDeCode($string) {
        if (empty($string)) {
            return array();
        }
        $string = stripslashes(urldecode($string));
        return json_decode($string, true);
    }

    /**
      +--------------------------------------------------------------------------
     * 获取客户端IP地址
      +--------------------------------------------------------------------------
     */
    static function getIP() {
        $ip = '';
        if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("REMOTE_ADDR")) {
            $ip = getenv("REMOTE_ADDR");
        } else {
            $ip = "Unknow";
        }
        return $ip;
    }

    /**
      +--------------------------------------------------------------------------
     * 过滤文章内容中的多余标签
      +--------------------------------------------------------------------------
     * @param string $tags 需要保留的标签
     * @return string
     */
    static function getArticleContent($content, $tags = '') {
        $tags .= '<b><br><p><div><strong><u><span><img><ul><li><ol>';
        $content = strip_tags($content, $tags);
        return $content;
    }

    /**
      +--------------------------------------------------------------------------
     * 根据当前时间获取问候语
      +--------------------------------------------------------------------------
     * @return string
     */
    static function getGreetings() {
        $hour = date('G', time());
        if ($hour >= 0 && $hour < 6) {
            $str = '凌晨好！';
        }
        if ($hour >= 6 && $hour < 12) {
            $str = '上午好！';
        }
        if ($hour >= 12 && $hour < 19) {
            $str = '下午好！';
        }
        if ($hour >= 19 && $hour <= 23) {
            $str = '晚上好！';
        }
        return $str;
    }

    /**
      +--------------------------------------------------------------------------
     * 返回由对象属性组成的关联数组
      +--------------------------------------------------------------------------
     */
    static function getArray($obj) {
        if (is_object($obj)) {
            $obj = get_object_vars($obj);
        }
        if (is_array($obj)) {
            foreach ($obj as $key => $value) {
                $obj[$key] = self::getArray($value);
            }
        }
        return $obj;
    }

    /**
     * 获取文件大小，并自动配到出合适的单位
     * @param int $file_size 文件大小，以字节为最小单位
     * @return int 文件大小
     */
    static function getFileSize($file_size = 0) {
        //如果小于1024，则用bit为单位
        if ($file_size < 1024) {
            return $file_size . 'Bit';
        }
        //如果小于1024*1024，则用KB为单位
        if ($file_size >= 1024 && $file_size < 1024 * 1024) {
            return number_format(($file_size / 1024), 2) . 'KB';
        }
        //如果小于1024*1024*1024，则用M为单位
        if ($file_size >= 1024 * 1024 && $file_size < 1024 * 1024 * 1024) {
            return number_format(($file_size / 1024 / 1024), 2) . 'M';
        }
        //如果小于1024*1024*1024*1024，则用G来表示
        if ($file_size >= 1024 * 1024 * 1024) {
            return number_format(($file_size / 1024 / 1024 / 1024), 2) . 'G';
        }
        //如果小于1024*1024*1024*1024*1024，则用T来表示
        if ($file_size >= 1024 * 1024 * 1024 * 1024) {
            return number_format(($file_size / 1024 / 1024 / 1024 / 1024), 2) . 'TB';
        }
    }

    /**
     * 制作随机密码
     * @return array 一维数组，第一个元素为原始密码（8个字符），第二个元素为md5加密后的密码
     */
    static function createRandPassword() {
        $str = 'abcdefghijklmnopqrstuvwxyz1234567890ZBCDEFGHIJKLMNOPQRSTUVWXYZ';
        $str_arr = str_split($str);
        $password = '';
        for ($i = 0; $i < 8; $i++) {
            $j = rand(0, 61);
            $password .= $str_arr[$j];
        }
        $password_md5 = md5($password);
        return array($password, $password_md5);
    }

    /**
     * 建立多层目录
     *
     * @param string $file_path 真实路径
     * @param string $mode 文件夹权限
     * @return boolean
     */
    static function makeMoreDir($file_path, $mode = 0777) {
        if (empty($file_path)) {
            return false;
        }
        $folderArray = explode('/', str_replace('//', '/', $file_path));
        $folder = "";
        foreach ($folderArray as $folderOne) {
            $folder .= '/' . $folderOne;
            if (!file_exists($folder)) {
                @mkdir($folder);
                @chmod($folder, $mode);
            }
        }
        return true;
    }

    /**
     * 过滤查询关键词
     * @param type $words
     */
    static function wordsFilter($words) {
        $array = array(',', '，', '“', '”', '’', '‘', '|', "｜", '\\', '/', "#", '%', '"', "'", ' ', '、', '+', '*', '&', ';', '!', '的', '地', '得', '?');
        foreach ($array as $ls) {
            $words = str_replace($ls, ' ', $words);
        }
        $array_arr = explode(' ', $words);
        $new_array_arr = array();
        foreach ($array_arr as $ls) {
            if (!empty($ls)) {
                $new_array_arr[] = trim($ls);
            }
        }
        return $new_array_arr;
    }

    /**
     * 加密函数
     * @param string $str 需要加密的数据
     * @param string $key 唯一密钥
     * 加密和解密函数中的参数cipher、key和mode必须一一对应，否则数据不能被还原
     * cipher——加密算法、key——密钥、data(str)——需要加密的数据、mode——算法模式、 iv——初始化向量
     * mode--电子代码本、密文块链、密文反馈、8位输出反馈、N位输出反馈和特殊的流模式
     * mode缩写--ecb、cbc、cfb、ofb、nofb和stream
     * @return string 加密后的数据（十六进制）
     */
    static function setEnCode($str, $key) {
        $str = trim($str);
        //开启加密算法
        $config = mcrypt_module_open('twofish', '', 'ecb', '');
        //建立 IV，并检测 key 的长度
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($config), MCRYPT_RAND);
        $keysize = mcrypt_enc_get_key_size($config);
        //生成 key 截取下长度
        $keystr = substr(md5($key), 0, $keysize);
        //初始化加密程序
        mcrypt_generic_init($config, $keystr, $iv);
        //加密, $encrypted 保存的是已经加密后的数据
        if (empty($str)) {
            return '';
        }
        $encrypted = mcrypt_generic($config, $str);
        //检测解密句柄，并关闭模块
        mcrypt_module_close($config);
        //转化为16进制
        $hexdata = bin2hex($encrypted);
        //返回
        return $hexdata;
    }

    /**
     * 解密函数
     * @param string $str 需要解密的数据
     * @param string $key 唯一密钥
     * 加密和解密函数中的参数cipher、key和mode必须一一对应，否则数据不能被还原
     * cipher——加密算法、key——密钥、data(str)——需要加密的数据、mode——算法模式、 iv——初始化向量
     * mode--电子代码本、密文块链、密文反馈、8位输出反馈、N位输出反馈和特殊的流模式
     * mode缩写--ecb、cbc、cfb、ofb、nofb和stream
     * @return string 解密后的数据
     */
    static function getDeCode($str, $key) {
        //开启加密算法
        $config = mcrypt_module_open('twofish', '', 'ecb', '');
        //建立 IV，并检测 key 的长度
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($config), MCRYPT_RAND);
        $keysize = mcrypt_enc_get_key_size($config);
        //生成 key 截取下长度
        $keystr = substr(md5($key), 0, $keysize);
        //初始化加密模块，用以解密
        mcrypt_generic_init($config, $keystr, $iv);
        //把加密后的十六进制数据 转成二进制数据
        $encrypted = pack('H*', $str);
        //解密
        $decrypted = mdecrypt_generic($config, $encrypted);
        //检测解密句柄，并关闭模块
        mcrypt_generic_deinit($config);
        mcrypt_module_close($config);
        //返回原始数据
        return trim($decrypted);
    }

    /**
     * 获取客户端IP
     * @return string IP地址
     */
    protected function clientIp() {
        $keys = array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR');

        foreach ($keys as $key) {
            if (empty($_SERVER[$key])) {
                continue;
            }
            $ips = explode(',', $_SERVER[$key], 1);
            $ip = $ips[0];
            if (false != ip2long($ip) && long2ip(ip2long($ip) === $ip)) {
                return $ips[0];
            }
        }

        return '0.0.0.0';
    }

}
